home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / zugabe / va45 / visual45 / objects / form / common.s < prev    next >
Text File  |  1998-09-06  |  27KB  |  975 lines

  1.     DATA
  2.  
  3. GWVA_FORM_DEFAULT_METHODLIST:
  4.     GWVA_OBJ_STRUCT_METHOD    GWVA_METHOD_CREATE,GWVA_FORM_PRG_CREATE
  5.     GWVA_OBJ_STRUCT_METHOD    GWVA_METHOD_DELETE,GWVA_FORM_PRG_DELETE
  6.     GWVA_OBJ_STRUCT_METHOD    GWVA_METHOD_FORM_BUTTON,GWVA_FORM_PRG_FORM_BUTTON
  7.     GWVA_OBJ_STRUCT_METHOD_END_LIST
  8.  
  9.     TEXT
  10.  
  11. ;------------------------------------------------------------------------------
  12. ; Method name : GWVA_METHOD_CREATE
  13. ; Asm label   : GWVA_FORM_PRG_CREATE
  14. ; Description : Création d'un objet formulaire
  15. ;
  16. ; in  : a0.l = pointeur sur l'objet
  17. ; in  : a1.l = pointeur sur la fenêtre
  18. ; in  : a2.l = pointeur sur le tree du ressource
  19. ; out : d6.w = GWVA_PRGRET_CONSUMED
  20. ; out : d7.w = GWVA_NO_ERROR_GENERIC ou erreur
  21. ;       GWVA_ERROR_BAD_CLASS
  22. ;
  23. ; 15/02/98 : Création
  24. ; 01/05/98 : Modification : test handle, test class, appel méthode CREATED
  25. ;------------------------------------------------------------------------------
  26. GWVA_FORM_PRG_CREATE:
  27.     GWVA_CHECK_OBJ_HANDLE
  28.  
  29.     ;-----------------------------------;
  30.  
  31.     ;-----------------------------------;
  32.  
  33.     ; envoyer la méthode GWVA_METHOD_CREATED
  34.  
  35.     GWVA_EXEC_VISUAL_EVENT    #GWVA_METHOD_CREATED
  36.  
  37.     moveq #GWVA_PRGRET_CONSUMED,d6
  38.     moveq #GWVA_NO_ERROR_GENERIC,d7
  39.     rts
  40.  
  41. .bad_object_class:
  42.     move #GWVA_ERROR_BAD_CLASS,d7        ; pas une classe formulaire
  43.     moveq #GWVA_PRGRET_CONSUMED,d6
  44.     rts
  45.  
  46. ;------------------------------------------------------------------------------
  47. ; Method name : GWVA_METHOD_DELETE
  48. ; Asm label   : GWVA_FORM_PRG_DELETE
  49. ; Description : Destruction d'un objet formulaire
  50. ;
  51. ; in  : a0.l = pointeur sur l'objet
  52. ; out : d6.w = GWVA_PRGRET_CONSUMED
  53. ; out : d7.w = GWVA_NO_ERROR_GENERIC
  54. ;
  55. ; 15/02/98 : Création
  56. ;------------------------------------------------------------------------------
  57. GWVA_FORM_PRG_DELETE:
  58.     moveq #GWVA_PRGRET_CONSUMED,d6
  59.     moveq #GWVA_NO_ERROR_GENERIC,d7
  60.     rts
  61.  
  62. ;------------------------------------------------------------------------------
  63. ; Method name : GWVA_METHOD_FORM_BUTTON
  64. ; Asm label   : GWVA_FORM_PRG_FORM_BUTTON
  65. ; Description : Effectue un form button sur un objet rsc
  66. ;
  67. ; Rq  : Réagit graphiquement au clic => appel à FORM_BUTTON et retourne
  68. ;
  69. ; in  : a0.l = pointeur sur l'objet
  70. ; in  : a1.l = pointeur sur le buffer d'entrée typé GWVA_FORM_BUTTON_IN
  71. ; in  : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_BUTTON_OUT
  72. ; in  : d0.l = [ X.w | num gem.w ]
  73. ; in  : d1.l = [ Y.w | mouse button.w ]
  74. ; in  : d2.l = [ Key state.w | mouse count.w ]
  75. ; out : d0.w = retour de la fonction
  76. ; out : d1.w = newobject (bit 15 mis si double clic et touche-exit)
  77. ; out : d6.w = GWVA_PRGRET_NOT_CONSUMED ou GWVA_PRGRET_CONSUMED
  78. ;
  79. ; 07/03/98 : Création
  80. ;------------------------------------------------------------------------------
  81. GWVA_FORM_PRG_FORM_BUTTON:
  82.  
  83.     btst #0,d1            ; bouton clické ?
  84.     beq .its_not_left_button
  85.  
  86. *.traite_click_formulaire:
  87.     move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a3
  88.     move d0,d3
  89.     mulu #L_OBJECT,d3
  90.     add.l d3,a3
  91.  
  92.     ; on teste si je suis pas sélectable mais que mon père le serait
  93.     ; et dans ce cas on fait comme si il avait cliqué dans mon père
  94.  
  95.     btst #SELECTABLE,ob_flags+1(a3)
  96.     bne.s .je_suis_selectable
  97.  
  98.     save.l d0-d2/a0-a3
  99.     move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a0    ; a0.l + d0.w num obj
  100.     bsr GWVA_RSC_FIND_FATHER_OBJECT
  101.     move d0,d3
  102.     move.l a0,a4
  103.     load.l d0-d2/a0-a3
  104.     cmp.w #GWVA_NO_ERROR_GENERIC,d7
  105.     bne.s .click_in_root
  106.  
  107.     btst #SELECTABLE,ob_flags+1(a4)
  108.     beq.s .mon_pere_est_pas_selectable
  109.  
  110.     move d3,d0        ; l'objet cliqué devient le père
  111.     move.l a4,a3    ; ruse pour les caractères "shortcut" sur les boutons
  112.  
  113. .mon_pere_est_pas_selectable:
  114. .je_suis_pas_selectable:
  115. .click_in_root:
  116. .je_suis_selectable:
  117.     ; à partir d'ici A3 pointe sur l'objet dans le formulaire
  118.  
  119.     move ob_state(a3),d3    ; D3 à sauver à partir d'ici (ancien état)
  120.  
  121.     move.w d0,GWVA_FORM_BUTTON_OUT_OBJECT(a2)
  122.     move.w d3,GWVA_FORM_BUTTON_OUT_OLD_STATE(a2)
  123.     move.l a3,GWVA_FORM_BUTTON_OUT_OBJ_PTR(a2)
  124.  
  125.     move #1,GWVA_FORM_BUTTON_OUT_RET_CODE(a2)    ; si disabled
  126.  
  127.     btst #DISABLED,d3
  128.     bne .object_disabled
  129.  
  130.     ;--------------
  131.  
  132.     ifd MDL_FORM_EDITABLE_TEXT2
  133.  
  134.     ; a2 ne pointe plus sur le objet du rsc
  135.  
  136.     btst #EDITABLE,ob_flags+1(a2)    ; éditable ? G_FTEXT G_FBOXTEXT
  137.     beq .pas_texte_editable
  138.  
  139.     ; d0 : objet
  140. ** d2 est scratché !    
  141.     ; d2 : quoi redressiner
  142.     ; d3 : état de l'objet avant modifs
  143.     ; a0 : window
  144.     ; a1 : ptr form struct
  145.     ; a2 : ptr objet cliqué
  146.  
  147.     save.l d0/d2/d3/a0-a2
  148.  
  149.     v_hide_c
  150.  
  151.     movem.l (sp),d0/d2/d3/a0-a2
  152.  
  153.     bsr GWVA_WFORM_OBJ_PRG_HIDE_CURSOR
  154.  
  155.     movem.l (sp),d0/d2/d3/a0-a2
  156.  
  157.     cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
  158.     beq.s .no_lost_focus_cause_no_change_objet
  159.     move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
  160.     move #GWVA_EVNT_LOSTFOCUS,d7
  161.     lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  162.     bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
  163.  
  164.     movem.l (sp),d0/d2/d3/a0-a2
  165.  
  166. .no_lost_focus_cause_no_change_objet:
  167.  
  168. ; Affiche le curseur texte sur le nouvel objet
  169.  
  170.     move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),-(sp)    ; on sauve avant d'écraser
  171.  
  172.     ifd OPT_GWVA_WIND_FORM_CURS_POS_WITH_MOUSE
  173.  
  174.     move.w GWVA_APP_OBJ_EVNT_MULTI_MX,d1
  175.     bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR_X
  176.     else
  177.     move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
  178.     move.w d0,d1
  179.     mulu #L_OBJECT,d1
  180.     move.w ([a2,d1.l,ob_spec],te_txtlen),d1
  181.     subq.w #1,d1        ; positionne à la fin du champ éditable
  182.                 ; (comportement du V.A. normal)
  183.     bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR
  184.     endc
  185.  
  186.     move.w (sp)+,d1        ; Ancien objet ayant le focus
  187.  
  188.     movem.l (sp),d0/d2/d3/a0-a2
  189.  
  190.     cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d1
  191.     beq.s .no_got_focus_cause_no_change_objet
  192.     ; d0 : objet gagnant le focus
  193.     move #GWVA_EVNT_GOTFOCUS,d7
  194.     lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  195.     bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
  196.  
  197.     movem.l (sp),d0/d2/d3/a0-a2
  198. .no_got_focus_cause_no_change_objet:
  199.  
  200.     v_show_c #1
  201.  
  202.     ifd MDL_CHILDREN_WINDOWS
  203.  
  204.     movem.l (sp),d0/d2/d3/a0-a2
  205.  
  206.     bsr GWVA_WIND_OBJ_PRG_RETURN_TOP_FAMILY_MEMBER
  207.     bsr GWVA_WIND_OBJ_PRG_RETURN_FOCUSED_CHILD
  208.     tst d7
  209.     bmi.s .no_focused_at_this_time
  210.  
  211.     bclr #GWVA_WIN_BIT_FOCUSED,GWVA_WIND_OBJ_STATUS+1(a0)
  212.  
  213. .no_focused_at_this_time:
  214.     load.l d0/d2/d3/a0-a2
  215.  
  216.     bset #GWVA_WIN_BIT_FOCUSED,GWVA_WIND_OBJ_STATUS+1(a0)
  217.  
  218.     else
  219.  
  220.     load.l d0/d2/d3/a0-a2
  221.  
  222.     endc    ; ifd MDL_CHILDREN_WINDOWS
  223.  
  224. .pas_texte_editable:
  225.  
  226.     endc    ; ifd MDL_FORM_EDITABLE_TEXT
  227.  
  228.     ;--------------
  229.  
  230.     save.l d0-d3/a0-a3
  231.     form_button GWVA_FORM_BUTTON_IN_TREE_PTR(a1),d0,d2    ; ptr,obj,m_count
  232.     move d0,d5
  233.     move.w int_out+2,d4    ; *newobject : index de l'objet s'il est
  234.             ; éditable ou exit (bit 15 mis si double clic et touche-exit)
  235.     load.l d0-d3/a0-a3
  236.  
  237.     move.w d5,GWVA_FORM_BUTTON_OUT_RET_CODE(a2)
  238.     move.w d4,GWVA_FORM_BUTTON_OUT_NEW_OBJECT(a2)
  239.  
  240.     ; il retourne un zéro si
  241.     ; bouton est exit avec le click relaché dans le bouton
  242.     ; bouton est touch_exit qqs la position de la souris au relachement
  243.  
  244.     tst d5
  245.     bne.s .propriete_exit_non_activee
  246.  
  247.     ; conditions de redessin ...
  248.  
  249.     btst #RBUTTON,ob_flags+1(a3)
  250.     bne.s .radio_no_redraw        ; car radio bouton : le GEM
  251.                 ; a déjà dessiné pour nous
  252.  
  253.     btst #SELECTABLE,ob_flags+1(a3)    ; l'objet doit etre selectionable pour changer d'état
  254.     beq.s .no_selectable
  255.  
  256.     bclr #SELECTED,ob_state+1(a3)    ; désélection de l'objet
  257.     beq.s .no_redraw_object        ; pas de redraw si pas sélectionné
  258.  
  259. *    move.w #1,d1
  260. ** d2 est scratché !    
  261. *    ; d2 est configuré !
  262. *    save.l d0-d3/a0-a3
  263. *    bsr GWVA_FORM_WIND_OBJ_PRG_REDRAW_PART
  264. *    load.l d0-d3/a0-a3
  265.  
  266.     save.l d0-d3/a0-a3
  267. *    move.l GWVA_FORM_BUTTON_IN_WIND_PTR(a1),a0
  268. *    bsr GWVA_WIND_RETURN_INT_ABS_POS_SIZE
  269. *    swap d2
  270. *    move d3,d2
  271. *    GWVA_CALL_METHODNTEST    #GWVA_METHOD_WIND_REDRAW_PART_CONTENTS,#GWVA_MODE_SEARCH_EXEC_UNIQUE
  272.  
  273.     move.l GWVA_FORM_BUTTON_IN_WIND_PTR(a1),a0
  274.     lea GWVA_WFORM_FBUTTON_TMP_OBJ_LIST,a1
  275.     move.w d0,(a1)
  276.     move.w #1,2(a1)
  277.     move.w #GWVA_WRSC_CTE_REDRAW_PART_END_LIST,4(a1)
  278.     GWVA_CALL_METHOD_OTHER_OBJ    #GWVA_METHOD_WRSC_REDRAW_PART_CONTENTS
  279.  
  280.     load.l d0-d3/a0-a3
  281.  
  282. .no_redraw_object:
  283. .no_selectable:
  284.  
  285.     bra.s .envoie_message        ; de toute façon
  286.  
  287. .radio_no_redraw:
  288. .propriete_exit_non_activee:
  289.     ; soit radio juste sélectable
  290.     ; soit bouton juste selectable
  291.  
  292.     btst #SELECTABLE,ob_flags+1(a3)    ; sélectionnable ?
  293.     beq .pas_selectionable
  294.  
  295.     cmp.w ob_state(a3),d3
  296.     beq .etat_inchange
  297.  
  298.     btst #RBUTTON,ob_flags+1(a3)
  299.     beq.s .bouton_normal
  300.  
  301.     ; ici : radio-bouton
  302.  
  303.     save.l d0-d3/a0-a3
  304.     move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a0    ; a0.l + d0.w num obj
  305.     bsr GWVA_RSC_FIND_FATHER_OBJECT
  306.     move d0,d4
  307.     load.l d0-d3/a0-a3
  308.     swap d0    ; on garde l'obj cliqué mais on bosse avec le père
  309.     move d4,d0
  310.  
  311. .bouton_normal:
  312. .envoie_message:
  313.  
  314.     ******
  315.     ifeq 1
  316.     ******
  317.  
  318.     ; le dessin de l'objet a été modifié car l'objet a changé d'état
  319.     ; il est peut-être radio sans rien ou juste selectable
  320.  
  321.     lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  322.  
  323. .do_research:
  324.     tst GWVA_WFORM_OBJ_DEF_OBJ_NUM(a2)
  325.     bmi .objet_clicke_non_trouve    ; pas dans la liste
  326.  
  327.     cmp.w GWVA_WFORM_OBJ_DEF_OBJ_NUM(a2),d0
  328.     beq.s .found_obj
  329.     lea GWVA_WFORM_OBJFORMLIST_LENGTH(a2),a2
  330.     bra.s .do_research
  331.  
  332. .found_obj:    move.l GWVA_WFORM_OBJ_DEF_OBJ_PTR_STRUCT(a2),a3    ; ptr sur la structure de l'objet
  333.  
  334.     ********* Traitement de l'évènement click en fonction du type d'objet ******
  335.  
  336.     cmp.w #GWVA_FORM_WIND_OBJECT_GENERIC,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  337.     bne.s .not_a_generic_object    ; objet generic = non selectionnable
  338.  
  339.     save.w d0-d3
  340.     save.l a0-a3
  341.     bsr GWVA_WFORM_OBJ_PRG_METHD_GENERIC
  342.     load.l a0-a3
  343.     load.w d0-d3
  344. .not_a_generic_object:
  345.  
  346.     cmp.w #GWVA_FORM_WIND_OBJECT_BUTTON,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  347.     bne.s .not_a_button_object    ; objet bouton = selectionnable
  348.  
  349.     save.w d0-d3
  350.     save.l a0-a3
  351.     bsr GWVA_WFORM_OBJ_PRG_METHD_SELECT
  352.     load.l a0-a3
  353.     load.w d0-d3
  354. .not_a_button_object:
  355.  
  356.     ifd FORM_OBJ_POPUP
  357.     cmp.w #GWVA_FORM_WIND_OBJECT_MENU_POPUP,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  358.     bne .not_a_menu_popup
  359.  
  360.     save.w d0-d3
  361.     save.l a0-a3
  362.     bsr GWVA_WFORM_OBJ_PRG_METHD_POPUP
  363.     load.l a0-a3
  364.     load.w d0-d3
  365. .not_a_menu_popup:
  366.     endc
  367.  
  368.     ifd FORM_OBJ_RADIO_BUTTON
  369.     cmp.w #GWVA_FORM_WIND_OBJECT_RADIO_BUTTON,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  370.     bne .not_a_radio_bouton
  371.  
  372.     save.w d0-d3
  373.     save.l a0-a3
  374.     bsr GWVA_WFORM_OBJ_PRG_METHD_RADIO
  375.     load.l a0-a3
  376.     load.w d0-d3
  377. .not_a_radio_bouton:
  378.     endc
  379.  
  380.     ifd FORM_OBJ_CLICK_EQUIV
  381.     cmp.w #GWVA_FORM_WIND_OBJECT_CLIK_EQUIV,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  382.     bne.s .not_a_click_eq_object
  383.  
  384.     save.w d0-d3
  385.     save.l a0-a3
  386.     bsr GWVA_WFORM_OBJ_PRG_METHD_EQUIVALENT
  387.     load.l a0-a3
  388.     load.w d0-d3
  389. .not_a_click_eq_object:
  390.     endc
  391.  
  392.     ifd FORM_OBJ_EXTD_TEXT
  393.     cmp.w #GWVA_FORM_WIND_OBJECT_EXTD_TEXT,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
  394.     bne.s .not_an_extd_text_object
  395.  
  396.     save.w d0-d3
  397.     save.l a0-a3
  398.     bsr GWVA_WFORM_OBJ_PRG_METHD_EXTD_TEXT
  399.     load.l a0-a3
  400.     load.w d0-d3
  401. .not_an_extd_text_object:
  402.     endc
  403.  
  404.     ifd OPT_GWVA_WIND_FORM_CUSTOM_OBJECTS
  405.     tst.l GWVA_WFORM_OBJ_CUSTOM_OBJ_PRG
  406.     beq.s .no_routine_present
  407.     move.w GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2),d1    ; seul param non déjà initialisé
  408.     ; d0.l = No de l'objet    : cas spécial pour le radio bouton : objet clique dans le mot haut, père dans le mot bas
  409.     ; d1.w = type de l'objet
  410.     ; d2.w = que redessiner dans le cas d'un redraw d'une partie du form
  411.     ; d3.w = état de l'objet avant objc_edit
  412.     ; a0.l : pointeur sur la fenêtre
  413.     ; a1.l : pointeur sur la structure spécifique à la fenêtre FORMULAIRE
  414.     ; a2.l : pointeur sur la structure décrivant l'objet cliqué (No,shortcut,Type,Ptr struc)
  415.     ; a3.l : pointeur sur Ptr struc
  416.     jsr ([GWVA_WFORM_OBJ_CUSTOM_OBJ_PRG.l])
  417. .no_routine_present:
  418.     endc
  419.  
  420.     bra GWVA_MAIN_EVENTS_LOOP
  421.  
  422.         *-----------------*
  423.  
  424.  
  425. *.objet_clicke_non_trouve:
  426. *    move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
  427. *    move d0,d3
  428. *    mulu #L_OBJECT,d3
  429. *    add.l d3,a2
  430.  
  431.     ******
  432.     endc    ; ifeq 1
  433.     ******
  434.     
  435. .etat_inchange:
  436. .pas_selectionable:
  437. .object_disabled:
  438.  
  439.     move.w ob_state(a3),GWVA_FORM_BUTTON_OUT_NEW_STATE(a2)
  440.     move.w ob_type(a3),GWVA_FORM_BUTTON_OUT_NEW_TYPE(a2)
  441.  
  442. *    tst.l GWVA_WFORM_OBJ_CLICK_ROUTINE(a1)
  443. *    beq.s .pas_de_routine_click
  444. *    ; a0 = pointe sur la fenêtre formulaire
  445. *    ; a1 = pointe sur la structure formulaire
  446. *    ; a2 = pointeur sur la structure de l'objet clické
  447. *    ; d0 = numéro de l'objet
  448. *    ; d1.w = object flags
  449. *    ; d2.w = object state
  450. *    movem.w ob_flags(a2),d1-d2
  451. *    jsr ([GWVA_WFORM_OBJ_CLICK_ROUTINE,a1])
  452. *    bra GWVA_MAIN_EVENTS_LOOP
  453. *
  454. *.pas_de_routine_click:
  455.  
  456. .its_not_left_button:
  457.  
  458.     moveq #GWVA_PRGRET_CONSUMED,d6
  459.     rts
  460.  
  461.  BSS
  462. GWVA_WFORM_FBUTTON_TMP_OBJ_LIST:    ds.w 2+1
  463.  TEXT
  464.  
  465. ;------------------------------------------------------------------------------
  466.  
  467.     ;!!!!!!!!!!!!!!!!!!!!!
  468.  
  469.     ifd MDL_FORM_EDITABLE_TEXT
  470.  
  471.     ;!!!!!!!!!!!!!!!!!!!!!
  472.  
  473. ;------------------------------------------------------------------------------
  474. ; Method name : GWVA_METHOD_FORM_KEYBD
  475. ; Asm label   : GWVA_FORM_PRG_FORM_KEYB
  476. ; Description : Méthode pour traiter l'effet de l'appui d'une touche sur un champ texte
  477. ;
  478. ; in  : a0.l = pointeur sur l'objet
  479. ; in  : a1.l = pointeur sur le buffer de sortie typé GWVA_FORM_KEYB_IN
  480. ; in  : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_KEYB_OUT
  481. ; in  : d0.w = Champs texte où appliquer le Key code ou 0.w si aucun champ éditable
  482. ; in  : d2.w = Key code
  483. ; out : d6.w = GWVA_PRGRET_NOT_CONSUMED s'il faut faire un objc_edit derrière
  484. ;       ou GWVA_PRGRET_CONSUMED si la touche a été consommée
  485. ;
  486. ; 10/05/98 : Création
  487. ;------------------------------------------------------------------------------
  488. GWVA_FORM_PRG_FORM_KEYB:
  489.  
  490.     save.l a0-a2/d0-d2
  491.     form_keybd GWVA_FORM_KEYB_IN_TREE_PTR(a1),d0,#1,d2
  492.     move d0,d3
  493.     load.l a0-a2/d0-d2
  494.  
  495.     move.w d3,GWVA_FORM_KEYB_OUT_RET_CODE(a2)
  496.     move.w int_out+1*2,d4
  497.     move.w d4,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2)
  498.     move.w int_out+2*2,d5
  499.     move.w d5,GWVA_FORM_KEYB_OUT_KEY_OUT(a2)
  500.  
  501.     tst d3    ; 0 = bouton 'exit' default, 1 = pas de bouton en 'default'
  502.     beq .objet_defaut_active
  503.  
  504.     tst d5        ; a-t-il réussi à la traiter ?
  505.     bne .fkbd_pas_pu_traiter_touche
  506.  
  507.     ; Patch pour le GEM qui renvoie new_obj =0 si pressé enter
  508.     ; et pas de bouton default
  509.     tst d4
  510.     bne.s .pas_patch_new_obj_eq_0
  511. .common_patch_buggy_default:
  512.     move d3,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2)    ; new=old => ne rien faire
  513. .pas_patch_new_obj_eq_0:
  514.  
  515. .objet_defaut_active_correctement:
  516.     moveq #GWVA_PRGRET_CONSUMED,d6
  517.     rts
  518.         ;----------
  519.  
  520. .objet_defaut_active:
  521.     move d4,d6            ; new obj
  522.  
  523.     mulu #L_OBJECT,d6
  524.     add.l GWVA_FORM_KEYB_IN_TREE_PTR(a1),d6
  525.     move.l d6,a3
  526. *    btst #EDITABLE,ob_flags+1(a3)    ; éditable ?
  527. *    beq .next_obj_pas_editable
  528.  
  529.     bclr #SELECTED,ob_state+1(a3)    ; désélection de l'objet
  530.  
  531.     btst #DISABLED,ob_state+1(a3)    ; objet 'default' disable ? -> on doit le réafficher deselectionner ?_PATCH_?
  532.     bne.s .objet_defaut_active_but_disable
  533.  
  534.     btst #SELECTABLE,ob_flags+1(a3)    ; objet 'default' pas selectable ? -> on doit le réafficher deselectionner ?_PATCH_?
  535.     beq.s .objet_defaut_active_but_not_selectable
  536.  
  537.     bra.s .objet_defaut_active_correctement
  538.  
  539. .objet_defaut_active_but_not_selectable:
  540. .objet_defaut_active_but_disable:
  541.     move.w #1,GWVA_FORM_KEYB_OUT_RET_CODE(a2)    ; on vire le 'default activated'
  542.     bra.s .common_patch_buggy_default
  543.  
  544.         ;----------
  545.  
  546. .fkbd_pas_pu_traiter_touche:
  547.  
  548.     moveq #GWVA_PRGRET_NOT_CONSUMED,d6
  549.     rts
  550.  
  551.         ;----------
  552.  
  553. *    save.l d0/a0/a1
  554. *
  555. *    v_hide_c
  556. *
  557. *    movem.l (sp),d0/a0/a1
  558. *
  559. *    bsr GWVA_WFORM_OBJ_PRG_HIDE_CURSOR
  560. *
  561. *    movem.l (sp),d0/a0/a1
  562. *
  563. *    cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
  564. *    beq.s .no_lost_focus_event_cause_no_change_objet
  565. *    move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
  566. *    move #GWVA_EVNT_LOSTFOCUS,d7
  567. *    lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  568. *    bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
  569. *
  570. *    movem.l (sp),d0/a0/a1
  571. *
  572. *.no_lost_focus_event_cause_no_change_objet:
  573. *
  574. *    move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),-(sp)    ; on sauve avant d'écraser
  575. *
  576. *    *move d0,GWVA_WIND_OBJ_FOCUSED_OBJECT(a0)
  577. *
  578. *    move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
  579. *    move.w d0,d1
  580. *    mulu #L_OBJECT,d1
  581. *    move.w ([a2,d1.l,ob_spec],te_txtlen),d1
  582. *    subq.w #1,d1
  583. *    cmp.w GWVA_WIND_OBJ_FOCUSED_OBJ_CURSOR_POS(a0),d1
  584. *    blt.s .pos_curseur_sup_longueur_texte
  585. *    move.w GWVA_WIND_OBJ_FOCUSED_OBJ_CURSOR_POS(a0),d1
  586. *.pos_curseur_sup_longueur_texte:        ; positionne si possible au meme endroit dans le nouveau champ texte éditable
  587. *    bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR
  588. *
  589. *    move.w (sp)+,d1
  590. *    movem.l (sp),d0/a0/a1
  591. *
  592. *    cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d1
  593. *    beq.s .no_got_focus_cause_no_change_objet
  594. *    ; d0 : objet gagnant le focus
  595. *    move #GWVA_EVNT_GOTFOCUS,d7
  596. *    lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  597. *    bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
  598. *.no_got_focus_cause_no_change_objet:
  599. *
  600. *    v_show_c #1
  601. *
  602. *    load.l d0/a0/a1
  603. *
  604. *.next_obj_pas_editable:
  605. *    bra GWVA_MAIN_EVENTS_LOOP
  606. *
  607. *.fkbd_pas_pu_traiter_touche:
  608. *
  609. *    move.w int_out+2*2,d0    ; touche
  610. *
  611. *    save.l d0/a0/a1
  612. *
  613. *    v_hide_c
  614. *
  615. *    movem.l (sp),d0/a0/a1
  616. *
  617. *    ; Entrée : a0=ptr fenêtre
  618. *    ;        : a1=ptr spec ptr
  619. *    ;        : d0=touche
  620. *
  621. *    bsr GWVA_WFORM_OBJ_PRG_INSERT_CHAR_IN_WINDOW
  622. *
  623. *    ; sortie : d0=code d'erreur (0=touche non traitée)
  624. *    ; la position du curseur a été modifiée si nécéssaire
  625. *
  626. *    save.w d0
  627. *    v_show_c #1
  628. *    load.w d1        ; d1 : code de retour
  629. *
  630. *    load.l d0/a0/a1
  631. *
  632. *; BUG de l'AES : on ne sait pas si la touche a pu etre traité correctement par le champ
  633. *; éditable. Par exemple, si on essaie de rentrer une lettre dans un champ décimal,
  634. *; on n'est pas averti par l'AES que l'opération est impossible.
  635. *; Par conséquent, on envoit des messages CHANGED alors que le champ texte n'a pas été
  636. *; modifié.
  637. *
  638. *    tst d1
  639. *    beq .touche_intraitable
  640. *
  641. *    ; pour l'event text changed ...
  642. *
  643. *    cmp.w #$4b00,GWVA_APP_OBJ_EVNT_MULTI_KC
  644. *    beq.s .fleche_gauche
  645. *    cmp.w #$4d00,GWVA_APP_OBJ_EVNT_MULTI_KC
  646. *    beq.s .fleche_droite
  647. *
  648. *    save.l a0/a1
  649. *    move GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
  650. *    move #GWVA_EVNT_CHANGED,d7
  651. *    lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
  652. *    bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
  653. *    load.l a0/a1
  654. *
  655. *.fleche_gauche:
  656. *.fleche_droite:
  657. *
  658. *    bra GWVA_MAIN_EVENTS_LOOP
  659. *
  660. *.end_evnt_keyboard:
  661. *.pas_window_formulaire:
  662.  
  663.  
  664.     *******
  665.  
  666.     ifeq 1
  667.  
  668.     save.l a0-a2
  669.     form_keybd GWVA_FORM_KEYB_IN_TREE_PTR(a1),#0,#1,d0
  670.     load.l a0-a2
  671.  
  672.     move.w d0,GWVA_FORM_KEYB_OUT_RET_CODE(a2)
  673.     move.w int_out+1*2,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2)
  674.  
  675.     tst d0    ; 0 = bouton 'exit' default, 1 = pas de bouton en 'default'
  676.     bne.s .pas_objet_defaut_active
  677.  
  678.     ; on peut se rebrancher ici apres un 'enter' dans un champs de texte editable
  679. .objet_defaut_active:
  680.  
  681.     move.w int_out+1*2,d0    ; default object
  682.     move.w d0,d1
  683.     mulu #L_OBJECT,d1
  684.     add.l GWVA_WFORM_OBJ_FORM_PTR(a1),d1
  685.     move.l d1,a2
  686.  
  687.     bclr #SELECTED,ob_state+1(a2)    ; désélection de l'objet
  688.  
  689.     btst #DISABLED,ob_state+1(a2)    ; objet 'default' disable ? -> on doit le réafficher deselectionner ?_PATCH_?
  690.     bne.s .objet_defaut_active_but_disable
  691.  
  692.     btst #SELECTABLE,ob_flags+1(a2)    ; objet 'default' pas selectable ? -> on doit le réafficher deselectionner ?_PATCH_?
  693.     beq.s .objet_defaut_active_but_not_selectable
  694.  
  695.     ; pas de redessin si le bouton 'default' est selectable et pas disable ->
  696.     ; la routine de clic souris s'en chargera mieux que nous ...
  697.  
  698.     bra .transform_a_keyb_evnt_into_a_click_evnt
  699.  
  700. .objet_defaut_active_but_not_selectable:
  701. .objet_defaut_active_but_disable:
  702.  
  703.     ; il faut faire un redessin car le gem sur un form_keyb
  704.     ; et un 'enter' va enfoncer meme un objet disable
  705.     ; et la routine click, elle, plus intelligente ne le fera pas
  706.     save.l d0/a0-a1
  707.     move.w #1,d1
  708.     clr d2
  709.     bsr GWVA_FORM_WIND_OBJ_PRG_REDRAW_PART
  710.     load.l d0/a0-a1
  711.  
  712.     bra .transform_a_keyb_evnt_into_a_click_evnt
  713.  
  714. .touche_intraitable:
  715. .pas_objet_defaut_active:
  716.     bra .end_evnt_keyboard
  717.  
  718.     endc    ; ifeq 1
  719.  
  720. ;------------------------------------------------------------------------------
  721. ; Method name : GWVA_METHOD_FORM_OBJC_EDIT
  722. ; Asm label   : GWVA_FORM_PRG_FORM_OBJC_EDIT
  723. ; Description : Méthode pour traiter l'effet de l'appui d'une touche sur un champ texte
  724. ;
  725. ; in  : a0.l = pointeur sur l'objet
  726. ; in  : a1.l = pointeur sur le buffer de sortie typé GWVA_FORM_OBJC_EDIT_IN
  727. ; in  : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_OBJC_EDIT_OUT
  728. ; in  : d0.w = index GEM de l'objet devant faire l'objc_edit
  729. ; in  : d1.w = position du curseur
  730. ; in  : d2.w = [ Key state.w | Key code.w ]
  731. ; out : d6.w = GWVA_PRGRET_NOT_CONSUMED ou GWVA_PRGRET_CONSUMED
  732. ;
  733. ; 10/05/98 : Création
  734. ;------------------------------------------------------------------------------
  735. GWVA_FORM_PRG_FORM_OBJC_EDIT:
  736.  
  737.     save.l a0-a2/d0-d2
  738.     objc_edit GWVA_FORM_OBJC_EDIT_IN_TREE_PTR(a1),d0,d2,d1,#2
  739.     move d0,d3
  740.     load.l a0-a2/d0-d2
  741.  
  742.     move.w d3,GWVA_FORM_OBJC_EDIT_OUT_RET_CODE(a2)
  743.     move.w int_out+1*2,GWVA_FORM_OBJC_EDIT_OUT_CURS_NEW_POS(a2)    ; nouvelle position du curseur
  744.  
  745.     moveq #GWVA_PRGRET_CONSUMED,d6
  746.     rts
  747.  
  748. ;------------------------------------------------------------------------------
  749.  
  750.     ;!!!!!!!!!!!!!!!!!!!!!
  751.  
  752.     endc    ; ifd MDL_FORM_EDITABLE_TEXT
  753.  
  754.     ;!!!!!!!!!!!!!!!!!!!!!
  755.  
  756.  
  757.     ifd OPT_GWVA_WFORM_POS_CURS_WITH_MOUSE
  758.  
  759. ;------------------------------------------------------------------------------
  760. ; Method name : -
  761. ; Asm label   : GWVA_FORM_PRG_DRAW_CURSOR_X
  762. ; Description : positionne et affiche le curseur texte à une position x écran
  763. ; Description : (dans un champ éditable) + mets à jour la structure
  764. ;
  765. ; in  : a0.l = pointeur sur l'objet fenêtre contenant l'objet
  766. ; in  : d0.w = No objet texte editable à focuser
  767. ; in  : d1.w = position x absolue où positionner le curseur
  768. ;
  769. ; 05/09/98 : Création
  770. ;------------------------------------------------------------------------------
  771. GWVA_FORM_PRG_DRAW_CURSOR_X:
  772.  
  773.     move.w d0,GWVA_WFORM_OBJ_FOCUSED_IDX(a0)
  774.     bsr GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X
  775.  
  776.     move.w d0,GWVA_WFORM_OBJ_FOCUSED_IDX_CURSOR_POS(a0)
  777.     bsr GWVA_WFORM_REDRAW_CURSOR
  778. *    bsr GWVA_WFORM_PRG_DRAW_CURSOR
  779.     rts
  780.  
  781. ;------------------------------------------------------------------------------
  782. ; Method name : -
  783. ; Asm label   : GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X
  784. ; Description : retourne la position en caractère avec en entrée la position
  785. ; Description : en X dans un champs éditable
  786. ;
  787. ; in  : a0.l = pointeur sur l'objet fenêtre contenant l'objet
  788. ; in  : d0.w = No objet texte editable à focuser
  789. ; in  : d1.w = position x absolue où positionner le curseur
  790. ; out : d0.w = position curseur dans le champ éditable
  791. ;
  792. ; 05/09/98 : Création
  793. ;------------------------------------------------------------------------------
  794. GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X:
  795.  
  796.     move.l GWVA_WRSC_OBJ_TREE_PTR(a0),a1
  797.  
  798.     move.w d0,d4
  799.     mulu #L_OBJECT,d4
  800.     lea (a1,d4.l),a2
  801.     move.l ob_spec(a2),a1
  802.  
  803.     save.l a0-a2/d0-d1
  804.     bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
  805. ; d0 : position du curseur dans l'objet texte
  806. ; d1 : position du curseur dans le champ editable
  807. ; d2 : longueur du champ texte
  808.     load.l a0-a2/d0-d1
  809.  
  810.     move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d4
  811.     cmp.w #5,te_font(a1)        ; small font ?
  812.     bne.s .pas_de_small_font
  813.     move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d4
  814. .pas_de_small_font:
  815.  
  816.     mulu d4,d2        ; taille du text en pixel
  817.  
  818.     save.l a0-a2/d0-d2
  819.     objc_offset GWVA_WRSC_OBJ_TREE_PTR(a0),d0
  820.     load.l a0-a2/d0-d2
  821.  
  822.     move.w int_out+1*2,d4    ; position x de l'objet texte
  823.  
  824.     cmp.w #0,te_just(a1)    : justification gauche ?
  825.     beq.s .justified_left
  826.  
  827.     cmp.w #1,te_just(a1)    : justification droite ?
  828.     bne.s .not_justified_right
  829.  
  830.     move.w ob_width(a2),d5
  831.     sub.w d2,d5
  832.     add.w d5,d4
  833. .not_justified_right:
  834.  
  835.     cmp.w #2,te_just(a1)    : justification centrée ?
  836.     bne.s .not_justified_center
  837.  
  838.     move.w ob_width(a2),d5
  839.     sub.w d2,d5
  840.     asr.w #1,d5
  841.     add.w d5,d4
  842. .not_justified_center:
  843. .justified_left:
  844. ; -> d4 : position x du debut du texte en pixel
  845.  
  846.     sub.w d4,d1        ; position relative x de la souris dans le texte
  847.     bpl.s .souris_a_droite_debut_texte
  848.     moveq #0,d1
  849. .souris_a_droite_debut_texte:
  850.     cmp.w d2,d1
  851.     blt.s .souris_a_gauche_fin_texte
  852.     move.w d2,d1
  853. .souris_a_gauche_fin_texte:
  854.  
  855.     move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d4
  856.     cmp.w #5,te_font(a1)        ; small font ?
  857.     bne.s .pas_de_small_font2
  858.     move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d4
  859. .pas_de_small_font2:
  860.  
  861.     ext.l d1
  862.     divu d4,d1        ; d1 : caractère où placer le curseur
  863.  
  864.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT+2,a1
  865.     add.w d1,d1
  866.     add.w d1,a1        ; positionnement dans le texte
  867. .recherche_texte:
  868.     lea -2(a1),a1
  869.     cmp.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a1
  870.     beq.s .curseur_debut_texte
  871.     cmp.b #'_',-2+1(a1)
  872.     beq.s .recherche_texte
  873. .curseur_debut_texte:
  874.  
  875.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a2
  876.     clr.w d0
  877. .determine_position_curseur:
  878.     cmp.l a2,a1
  879.     beq.s .position_curseur_determinee
  880.     tst.b (a2)
  881.     beq.s .pas_caractere_editable
  882.     add.w #1,d0
  883. .pas_caractere_editable:
  884.     lea 2(a2),a2
  885.     bra.s .determine_position_curseur
  886. .position_curseur_determinee:
  887. ; -> d0.w
  888.     rts
  889.  
  890. ;------------------------------------------------------------------------------
  891. ; Method name : -
  892. ; Asm label   : GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
  893. ; Description : retourne les positions 1) dans le texte 2) dans le masque
  894. ; Description : + longeur texte pour un champs éditable
  895. ;
  896. ; in  : a1.l = pointeur sur l'ob_spec de l'objet
  897. ; out : d0.w = position du curseur dans l'objet texte (entre 0(à gauche 1er) et d2(à droite dernier))
  898. ; out : d1.w = position du curseur dans le champ editable
  899. ; out : d2.w = longueur du champ texte
  900. ;
  901. ; 05/09/98 : Création
  902. ;------------------------------------------------------------------------------
  903. GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT:
  904.  
  905.     move.l te_ptmplt(a1),a3
  906.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a5
  907.  
  908. .reconstruit_texte_non_editable:
  909.     clr.b (a5)+            ; type de texte - non editable
  910.     move.b (a3)+,(a5)+
  911.     tst.b -1(a5)
  912.     bne.s .reconstruit_texte_non_editable
  913.  
  914.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a3
  915.     move.l te_ptext(a1),a4
  916.  
  917. .reconstruit_texte_editable:
  918.     lea 2(a3),a3
  919.  
  920.     tst.b 1(a3)
  921.     beq.s .plus_de_texte_dispo
  922.  
  923.     cmp.b #'_',1(a3)        ; marque d'emplacement d'un texte editable
  924.     bne.s .reconstruit_texte_editable
  925.  
  926.     tst.b (a4)
  927.     beq.s .plus_de_texte_editable_dispo
  928.  
  929.     move.b (a4)+,1(a3)
  930.     move.b #1,(a3)        ; ce caractère est éditable
  931.  
  932.     tst.b (a4)
  933.     bne.s .reconstruit_texte_editable
  934.  
  935.     lea 2(a3),a3
  936.  
  937. .plus_de_texte_editable_dispo:
  938.     lea -2(a3),a5
  939.  
  940. .recherche_pos_curs:
  941.     lea 2(a5),a5
  942.     tst.b 1(a5)
  943.     beq.s .plus_de_texte_dispo
  944.     cmp.b #'_',1(a5)
  945.     bne.s .recherche_pos_curs
  946.     move.l a5,a3
  947. .plus_de_texte_dispo:
  948.  
  949.     sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a3
  950.     move.w a3,d0
  951.     asr.w #1,d0        ; position du curseur dans le champ texte
  952.     
  953.     sub.l te_ptext(a1),a4
  954.     move.w a4,d1    ; position du curseur dans le champ editable
  955.  
  956.     lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a3
  957. .calcul_longueur_texte:
  958.     lea 2(a3),a3
  959.     tst.b 1(a3)
  960.     bne.s .calcul_longueur_texte
  961.  
  962.     sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a3
  963.     move.w a3,d2
  964.     asr.w #1,d2        ; longueur du texte
  965.  
  966.     rts
  967.  
  968.  BSS
  969. GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT:    ds.b 256+2
  970.  TEXT
  971.  
  972.     endc    ; ifd OPT_GWVA_WFORM_POS_CURS_WITH_MOUSE
  973.  
  974. ;------------------------------------------------------------------------------
  975.